package material.command.remote;

public class RemoteControl {
    /*这个时候需要处理7个开与关的命令，
    所以使用相应的数组记录这些命令*/
    Command[] onCommands;
    Command[] offCommands;

    private final Integer commandNums = 7;

    /**
     * 构造器
     */
    public RemoteControl() {
        onCommands = new Command[commandNums];
        offCommands = new Command[commandNums];
        Command noCommand = new NoCommand();
        /*在构造器中实例化并初始化这 两个开关数组 */
        for (int i = 0; i < commandNums; i++) {
            onCommands[i] = noCommand;
            offCommands[i] = noCommand;
        }
    }

    /*setCommand()方法须有3个参数，分别是括槽的位置、开的命令、关的命令。
    这些命令将记录在关数组中对应的插槽位置，以供稍后使用。
     */
    public void setCommand(int solt, Command onCommand, Command offCommand) {
        onCommands[solt] = onCommand;
        offCommands[solt] = offCommand;

    }

    /*当按下开或关按钮，硬件就会负责调用相应的方法*/
    public void onButtonWasPushed(int solt) {
        onCommands[solt].execute();
    }

    public void offButtonWasPushed(int solt) {
        offCommands[solt].execute();
    }

    /**
     * 覆盖toString()，打印出每个插槽和它对应的命合。稍后在测试遥控器的时候，会用到这个方法。
     *
     * @return
     */
    public String toString() {
        StringBuffer stringBuff = new StringBuffer();
        stringBuff.append("\n------ Remote Control -------\n");
        for (int i = 0; i < onCommands.length; i++) {
            stringBuff.append("[slot " + i + "] " + onCommands[i].getClass().getName()
                    + "    " + offCommands[i].getClass().getName() + "\n");
        }
        return stringBuff.toString();
    }
}
